package com.changgou.search.service.impl;

import com.alibaba.fastjson.JSON;
import com.changgou.goods.feign.SkuFeign;
import com.changgou.goods.pojo.Sku;
import com.changgou.search.dao.SearchRepository;
import com.changgou.search.pojo.SkuInfo;
import com.changgou.search.service.SearchManageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * @author: zhengke
 * @date: 2020/12/18
 * @return:
 * @description:
 */

@Service
public class SearchManageServiceImpl implements SearchManageService {

    @Autowired //注入ES管理的方法
    private ElasticsearchTemplate elasticsearchTemplate; //对索引的操作  另一个repository是操作数据的

    @Autowired
    private SkuFeign skuFeign;//注入feign，方便调用

    @Autowired
    private SearchRepository searchRepository;//注入mapper，实现商品数据导入

    @Override
    public void createIndex() {
        elasticsearchTemplate.createIndex(SkuInfo.class);//创建索引库
        elasticsearchTemplate.putMapping(SkuInfo.class);//创建映射关系，找到SkuInfo类里所有的字段，并且根据字段的类型自动创建属性
    }

    @Override
    public void deleteIndex() {

        elasticsearchTemplate.deleteIndex(SkuInfo.class);//删除索引库，不用再单独删除表，类比数据库
    }

    @Override //此处要调用商品微服务的话要用到feign接口，所以到goods_api中写一个feign接口
    public void importBySpuId(String spuId) {
        //1 根据spuId调用feign接口查询商品列表
        List<Sku> skuList = skuFeign.findBySpuId(spuId);

        //将skuList转为json字符串
        String skuListJson = JSON.toJSONString(skuList);//将任何一个对象转换成json字符串

        //将json字符串转换为skuInfoList
        List<SkuInfo> skuInfoList = JSON.parseArray(skuListJson, SkuInfo.class);

        for (SkuInfo skuInfo : skuInfoList) {
            String specJson = skuInfo.getSpec();     //获取spec规格的json字符串
            Map specMap = JSON.parseObject(specJson, Map.class);//将json字符串转为map
            skuInfo.setSpecMap(specMap);             //ES保存此列的时候，会根据map里key的多少决定生成多少个列表
        }

        //2 将商品导入到es中
        searchRepository.saveAll(skuInfoList); //SearchRepository 的数据类型是skuinfo
    }

    @Override
    public void delBySpuId(String spuId) {
        //根据spuId查询商品列表
        List<Sku> skuList = skuFeign.findBySpuId(spuId);

        //遍历商品列表注意删除商品
        for (Sku sku : skuList) {
            searchRepository.deleteById(Long.valueOf(sku.getId()));//当初的主键id使用雪花算法生成的纯数字，所以需要强转；另外
                               //sku的主键id和SkuInfo的主键id是同一个，所以查到sku就可以实现删除，没必要再转成json，因此可用deleteById删除
        }
    }

    @Override
    public void importAll() {
        //1 查询全部数据
        List<Sku> skuList = skuFeign.findAllData();

        //2 转化数据 json
        String skuListJson = JSON.toJSONString(skuList);
        List<SkuInfo> skuInfoList = JSON.parseArray(skuListJson, SkuInfo.class);

        //3 遍历出specMap
        for (SkuInfo skuInfo : skuInfoList) {
            String specJSON = skuInfo.getSpec();
            Map specMap = JSON.parseObject(specJSON, Map.class);//specMap
            skuInfo.setSpecMap(specMap);
        }

        searchRepository.saveAll(skuInfoList);
    }
}
